home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1990: Night of the Living Disc / Night of the Living Disc.2mg / Dev.CD.5 / Apple.Software / Licensable.Code / PRINT.DRIVER / IMAGE.DBLHI < prev    next >
Encoding:
Text File  |  1985-02-15  |  15.5 KB  |  612 lines  |  [04] ASCII Text (0x2000)

  1. *--------------------------------
  2. *
  3. *
  4. * SCRIBIT PRODUCES A HARDCOPY
  5. * IMAGE OF THE APPLE II HIRES
  6. * SCREEN ON APPLE'S SCRIBE
  7. * PRINTER.
  8. *
  9. * PRINTER CARD CAN BE A SUPER SERIAL CARD,
  10. *  OR THE SERIAL PORT OF
  11. * THE APPLE ///.
  12. *
  13. * POKE ZERO-PAGE BYTE 06 WITH SLOT
  14. * NUMBER.  SLOT IS ADJUSTED TO 1
  15. * IF BYTE 6 = 0, 7 IF >7.
  16. *
  17. * SET ZERO-PAGE BYTE 07 TO ONE OF
  18. * THE FOLLOWING VALUES BEFORE EACH
  19. * SCREENDUMP UTILITY CALL:
  20. *   0 - SINGLE-SIZE, WHITE-ON-BLACK
  21. *   1 - BLACK-ON-WHITE
  22. *   2 - DOUBLE-SIZE, WHITE-ON-BLACK
  23. *   3 - BLACK-ON-WHITE
  24. *
  25. *   BIT 0 - WHITE-ON-BLACK/BLACK-ON-WHITE
  26. *   BIT 1 - SINGLE/DOUBLE-SIZED PICTURE
  27. *
  28. *   APG, APPLE COMPUTER - JUNE 1984
  29. *    - R. HOIBERG & M. HELLER
  30. *
  31. *
  32. *--------------------------------
  33. *
  34. *
  35. * ZERO-PAGE DATA -
  36. SLOT EQU 06 ;PARALLEL CARD SLOT
  37. XFRFLGS EQU 07 ;B7..B5:=B2..B0 OF PARAMETER'S LOW BYTE
  38. GCHAR EQU 06 ;APPLE DMP GRAPHICS CHAR (1X8 CELL)
  39. BITMASK EQU 08 ;MASKS OFF ALL BUT DESIGNATED BIT IN GR BYTE
  40. TEMP EQU 09 ;USED FOR 2XSIZE FF, HBASE CALCS
  41. CSWL EQU $36
  42. WARMSTART EQU $3D0
  43. VDOSIO EQU $BE34
  44. DOSIO EQU $03EA
  45. SBYTCNTR EQU $1B ; COUNTS VERTICAL BYTES ON SCREEN PRINTED
  46. ; RANGES 1-3.
  47. PBYTCNTR EQU $1C ; COUNTS VERTICAL BYTES SENT TO PRINTER
  48. FLAG EQU $1D ; FLAG IS SET (NON-ZERO) WHENEVER THE LINE
  49. ; THAT WE'RE PRINTING DOES NOT BEGIN AT THE
  50. ; START OF A VERTICAL SCREEN BYTE
  51. CTR1 EQU $1E ; THIS IS A LOOP COUNTER, USED WHEN WE NEED
  52. ; TO SEND THE SAME 3-BYTE COLUMN SEVERAL TIMES
  53. LSTSBCTR EQU $CE ; STORES THE VALUE OF SBYTCNTR AT THE END OF
  54. ; EVERY PRINTER LINE, SO WE HAVE IT LATER
  55. LASTEMP EQU $CF ; STORES THE VALUE OF TEMP AT THE END OF EVERY
  56. ; PRINTER LINE, SO WE HAVE IT LATER
  57. HBASE EQU $19 ; 2-BYTES ($19,$1A) HOLD LOW AND HI BYTES OF
  58. ; HI-RES ROW BASE ADDRESS
  59. GBYT EQU $EA ; BASE ADDRESS FOR STORING A COLUMN (3 BYTES)
  60. ; SO THAT THEY MAY BE RESENT TO ENLARGE IMAGE
  61. ; BYTES STORED IN GBYT+1, +2, AND +3.
  62. LASTBASE EQU $EE ; STORES THE HI-RES BASE ADDRESS AT THE END
  63. ; OF EACH PRINTER LINE SO WE CAN CALCULATE
  64. ; FROM IT LATER
  65. CNTR EQU $F9 ; LOOP COUNTER FOR THE SENDING OF REPEAT
  66. ; COLUMNS TO THE PRINTER (COUNTS BYTES AS
  67. ; RETREIVED FROM PAGE 0 - GBYT - AND SENT)
  68. PPSTAT EQU $C084 ;ADDR OF PARALLEL PRINTER STATUS BYTE
  69. PPDATA EQU $C080 ;ADDR OF PARALLEL PRINTER DATA BYTE
  70. OUTL EQU $FA
  71. OUTH EQU $FB
  72. OFFSET EQU $FC
  73. FINISHED EQU $FF
  74. SIGBYTES EQU $FE *AND $FF
  75. COMBYTE EQU $E74C
  76. BYTE EQU $E74F
  77. STORE80Y EQU $C001
  78. PAGE2N EQU $C054
  79. PAGE2Y EQU $C055
  80. PG2STAT EQU $C01C
  81. HIRESN EQU $C056
  82. HIRESY EQU $C057
  83. SSCDATA EQU $C088
  84. SSCSTAT EQU $C089
  85. SW1 EQU $C081
  86. SSCCOMM EQU $C08A
  87. SSCCONT EQU $C08B
  88. VIDOFF EQU $CFFF ; 80-COL CARD VECTOR
  89. OUTPRT EQU $FE95
  90. SETVID EQU $FE93
  91. APP3ID EQU $FA68
  92. COUT EQU $FDED
  93. SIGBYTE EQU $C00B
  94. ;
  95. SIGBYTE2 EQU $C00C
  96. ; HIRES EQUATES -
  97. HNDXMAX EQU $A7 ;$27 BYTES PER HIRES ROW
  98. CLMBYTES EQU $01 ; NUMBER OF BYTES FOR A SCRIBE COLUMN,
  99. ; 3 BYTES MAKE ONE 24-DOT COLUMN.
  100. ;
  101. ; DMP CONTROL CHARACTERS -
  102. NUL EQU $00 ;1ST XMIT CHAR IN CASE PTR POWERED ON
  103. LF EQU $0A ;LINEFEED
  104. CR EQU $0D ;CARRAIGE RETURN
  105. ESC EQU $1B ;ASCII 'ESCAPE' CHAR
  106. ASCII0 EQU $30
  107. ASCII1 EQU $31
  108. ASCII2 EQU $32
  109. ASCII3 EQU $33
  110. ASCII4 EQU $34
  111. ASCII5 EQU $35
  112. ASCII6 EQU $36
  113. ASCII7 EQU $37
  114. ASCII8 EQU $38
  115. ASCIIA EQU $41 ;ESC A FOR 1/6" LF
  116. ASCIIC EQU $43 ;ESC C nnnn FOR nnnn HIRES COLUMNS
  117. ASCIID EQU $44 ;ESC D N1 N0  TO OPEN DIP SWITCH
  118. ASCIIF EQU $46
  119. ASCIIG EQU $47 ;ESC G N3 N2 N1 N0 FOR BIT IMAGE GRAPHICS
  120. ASCIIj EQU $6A ;ESC j FOR 144x144 RESOLUTION
  121. ASCIIn EQU $6E
  122. ASCIIT EQU $54 ;ESC T N1 N0 FOR N/144" LF
  123. ASCIIU EQU $55
  124. ASCIIZ EQU $5A ;ESC Z N1 N0  TO CLOSE DIP SWITCH
  125. *
  126.  ORG $1B00
  127. *
  128.  JMP GrafBas ;APPLESOFT BASIC ENTRY POINT
  129.  JMP GrafML ;MACHINE LANGUAGE ENTRY POINT
  130. ;Y REGISTER CONTAINS SLOT NUMBER
  131. ;X REGISTER CONTAINS PRINT OPTION
  132. HINDEX DS 1 ; THIS COUNTS THE HI-RES VERTICAL BLOCKS
  133. ; AS THEY ARE PRINTED (A VERTICAL BLOCK IS
  134. ; 7 DOTS WIDE (1 BYTE) BY 24 DOTS TALL)
  135. HINDEXL DS 1
  136. HINDEXR DS 1
  137. PRFLG DS 1
  138. BINL DS 1
  139. BINH DS 1
  140. MYBUF DS 4
  141. TBLINDEX DS 1 ; A POINTER TO THE ADDRESS IN THE TABLE WHICH
  142. ; CONTAINS THE BASE ADRESS OF THE HORIZONTAL
  143. ; BLOCK BEING PRINTED (HORZ. BLOCK IS 280 DOTS
  144. ; WIDE BY 8 DOTS TALL - BASE ADDRESS IS
  145. ; ADDRESS OF UPPER-LEFTMOST DOT).
  146. *
  147. GrafML EQU *
  148.  LDA #0
  149.  STA VIDOFF ; RELEASE 80-COL CARD USE OF C800-CA00
  150.  STA STORE80Y ; ENABLE AUXILIARY MEMORY
  151.  STA HIRESY ; ENABLE HIRES SWITCHING
  152.  JSR FINDTYPE
  153.  LDA #ESC
  154.  JSR OUTPUT
  155.  LDA #'N'
  156.  JSR OUTPUT
  157.  LDA #ESC
  158.  JSR OUTPUT
  159.  LDA #'>'
  160.  JSR OUTPUT
  161. *                              ;SET UP STATUS AND DATA ADDRESSES
  162.  LDA XFRFLGS ;ADJUST XFROPTION BITS FOR EASIER TESTING
  163.  ROR  ;C:=WHITE-ON-BLACK/BLACK-ON-WHITE
  164.  ROR  ;C:=SINGLE/DOUBLE SIZE
  165.  ROR
  166.  AND #$C0 ;RESET REMAINING BITS
  167.  STA XFRFLGS ;B7,B6:=B1,B0
  168.  LDY #0
  169.  STY TEMP ;DOUBLE SIZE OUTPUT FLIPFLOP
  170. ;
  171. ; CLEAR PRINTER BUFFER
  172.  LDA #CR ;CLEAR BUFFER FOR GRAPHICS CHARS
  173.  JSR OUTPUT
  174. ;
  175. ; SET VERTICAL SPACING FOR GRAPHICS
  176. ; TO 22/144 OF AN INCH
  177.  LDA #ESC
  178.  JSR OUTPUT
  179.  LDA #ASCIIn
  180.  JSR OUTPUT
  181.  LDA #ESC ;ESC T 2 2
  182.  JSR OUTPUT
  183.  LDA #ASCIIT
  184.  JSR OUTPUT
  185.  LDA #ASCII1
  186.  JSR OUTPUT
  187.  LDA #ASCII6
  188.  JSR OUTPUT
  189. ;
  190.  LDA #0
  191.  STA TBLINDEX ; INTIALIZE TABLE INDEX TO TOP OF SCREEN
  192. ;
  193. ; FOR EVERY ROW -
  194. NEWLINE LDA #0 ; CLEAR THE FLAG (ONLY SET WHEN WE DO NOT BEGIN
  195.  STA FLAG ; A NEW PRTR LINE AT START OF A VERTICAL 8-DOT
  196. ; GROUP ON THE SCREEN).
  197. NEWLIN1 LDA #0
  198.  STA HINDEX ;INIT HIRES ROW BYTE COUNTER
  199.  STA PRFLG ; INITIALIZE PRFLG TO SCAN RATHER THAN PRINT
  200.  LDA #$40 ; INITIALIZE LEFT SIDE OF IMAGE MARKER
  201.  STA HINDEXL
  202. ;
  203. NEWVTBLK LDA #1
  204.  STA BITMASK ;INIT TO MASK OUT ALL BUT BYTE'S
  205. ; LEFT-MOST PIXEL
  206.  BIT HINDEX ; TEST MSB TO SEE WHICH HIRES PAGE TO READ.
  207.  BPL NEWVTBK1 ; MSB CLEAR, WE SHOULD USE AUX PAGE.
  208.  STA PAGE2N ; MSB SET, WE SWITCH TO MOTHERBOARD PAGE
  209.  JMP NEWCLMN
  210. NEWVTBK1 STA PAGE2Y ; SWITCH TO AUX PAGE.
  211. NEWCLMN LDA FLAG
  212.  BEQ NEWCLM3
  213.  STA TEMP
  214.  JMP NEWBYTE
  215. NEWCLM3 STA TEMP ; THE SCREEN BYTE COUNTER AND BIT POSITION
  216. NEWBYTE LDY TBLINDEX
  217.  LDA TABLE,Y
  218.  STA HBASE
  219.  LDA TABLE+1,Y
  220.  LDY TEMP
  221.  BEQ NEWBYT0
  222.  CLC
  223.  ADC #$10
  224. NEWBYT0 STA HBASE+1
  225. NEWBYT1 LDA #0
  226.  STA GCHAR ; CLEAR THE BYTE WE'LL SEND TO PRINTER
  227.  LDX #4
  228. NEWBIT LDA HINDEX ; GET MEM GRAPHICS BYTE INTO ACC, AND STRIP
  229.  AND #$7F
  230.  TAY
  231.  LDA (HBASE),Y ; OFF ALL BITS EXCEPT THE ONE CORRESPONDING
  232.  AND BITMASK ; TO DOT WE'RE CHECKING...
  233.  CMP #1 ;C:=1 IF GR BUFFER BIT IS ON
  234.  ROR GCHAR ; PUT CARRY INTO THE BYTE WE WILL SEND TO
  235.  CMP #1 ; PRINTER: 2 TIMES IF REGULAR SIZE, OR
  236.  ROR GCHAR
  237. NEWBIT1 DEX  ; ANOTHER SCRN DOT MOVED INTO GCHAR
  238. NEXTBIT TXA
  239.  BEQ NEXTBYTE ; GCHAR FILLED, SEND AND MOVE ON!
  240. NXTBIT1 LDA HBASE+1 ; GET HIGH-ORDER HIRES ROW BASE
  241.  CLC
  242.  ADC #4 ; ADD 4, SO WE'LL POINT AT NEXT ROW
  243.  STA HBASE+1 ; PUT NEW ROW BASE BACK
  244.  JMP NEWBIT ; GO BACK AND GET NEXT PIXEL DOWN
  245. NEXTBYTE LDA GCHAR
  246.  BIT XFRFLGS
  247.  BVS NXBYT0
  248.  EOR #$FF
  249.  STA GCHAR
  250. NXBYT0 BIT PRFLG ; ARE WE PRINTING, OR JUST SCANNING?
  251.  BPL NXBYT1 ; IF SCANNING, WE WANT TO JMP
  252.  JSR CHAROUT ; PRINTING, SO WE JSR
  253.  JMP NXTBYTRT
  254. NXBYT1 JMP PICSCAN ; SCANNING, JUMP TO CHAR SCAN ROUTINE
  255. NXTBYTRT LDA TEMP ; FOR REG SIZE, AFTER SENDING A PRINTER BYTE
  256.  EOR #1 ; WE'RE EITHER HALFWAY OR COMPLETELY THRU A
  257.  STA TEMP ; SCREEN BYTE - THUS ALL WE NEED IS A FLIPFLOP.
  258. NXTBYT2D ASL BITMASK ; NOW WE'LL MOVE ONE PIXEL OVER ON SCREEN
  259.  BIT BITMASK
  260.  BMI NXTBYT3 ; IF WE'VE DONE 7 BITS ACROSS, GO START ON NEXT
  261. ; VERTICAL BLOCK (7 PIXELS H BY 24 BITS V).
  262.  JMP NEWCLMN ; IF NOT, START ON NEXT COLUMN OF BITS OVER.
  263. NXTBYT3 BIT PRFLG
  264.  BMI NXBYT2
  265.  JMP LINENDT
  266. NXBYT2 LDA HINDEX
  267.  CMP HINDEXR
  268.  BEQ NXTBYT4
  269. NXBYT3 ASL HINDEX ; CHECK TO SEE WHICH PAGE WE'VE WORKED WITH.
  270.  BCC NXTBYT3A ; WE'VE BEEN WORKING WITH AUX PAGE...
  271.  LSR HINDEX ; NO, WE'VE BEEN READING MOTHERBOARD PAGE, SO
  272.  JMP NXTBYT3B ; XOR THE MSB OF HINDEX.
  273. NXTBYT3A SEC  ; HERE WE XOR THE MSB IF WE'VE WORKED WITH AUX
  274.  ROR HINDEX ; SETTING MSB, SO WE USE MOTHERBOARD NEXT BLK
  275. NXTBYT3B BIT HINDEX ; DID WE JUST FINISH A MOTHERBOARD BLOCK?
  276.  BPL NXTBYT3C ; YES, SO WE TEST TO SEE IF LINE IS DONE...
  277.  JMP NEWVTBLK ; NO, LINE CAN'T BE DONE, START NEXT VT. BLK.
  278. NXTBYT3C INC HINDEX ; WE'RE DONE WITH A VERT. BLOCK, MOVE ON TO
  279.  JMP NEWVTBLK ; ACROSS THE SCREEN, START ON NEXT
  280. ; VERTICAL BLOCK
  281. NXTBYT4 LDA #CR ; FINISHED A PRINTER LINE, SO...
  282.  JSR CHAROUT ; LET'S SEND A CARRIAGE RETURN
  283.  LDA #LF
  284.  JSR CHAROUT ; AND A LINEFEED TO THE SCRIBE
  285.  LDA TEMP ; STORE THE CRITICAL COUNTERS AND VARIABLES
  286.  BEQ NXTBYT5
  287.  STA FLAG
  288.  JMP NEWLIN1
  289. NXTBYT5 LDA TBLINDEX
  290.  CLC
  291.  ADC #$02 ; MOVING ON 3 ADDRESSES, TO NEXT
  292. ; 24 BY 280 BLOCK DOWN ON SCREEN
  293.  CMP #$30 ; THERE ARE 8 SUCH BLOCKS (8*6=$30)
  294.  BNE NXTBYT6 ; IF DONE, TIDY UP AND RETURN CONTROL TO DOS...
  295.  JMP FINI
  296. NXTBYT6 STA TBLINDEX ; PUT NEW TABLE INDEX BACK
  297.  JMP NEWLINE ; NOT DONE, START NEW LINE
  298. ;
  299. PICSCAN EQU * ; GBYTE SCAN ROUTINE TO FIND IMAGE EDGES
  300. FINDLFT BIT HINDEXL ; FOUND LEFT SIDE OF IMAGE YET?
  301.  BVC FINDRGT ; IF YES, WE ARE TO LOOK FOR RIGHT SIDE...
  302.  LDA GCHAR ; SEE IF LEFT SIDE BEGINS HERE.
  303.  BNE FINDLFT1 ; IF NOT, TEST FOR END OF LINE...
  304.  JMP NXTBYTRT
  305. FINDLFT1 LDA HINDEX ; IF IT DOES, WE SET HINDEXL TO VT BLOCK
  306.  STA HINDEXL ;  NUMBER WE ARE SCANNING.
  307.  JMP FINDRGT1
  308. FINDRGT LDA GCHAR ; SEE IF THIS IS POSSIBLE RIGHT EDGE OF IMAGE.
  309.  BEQ FINDRGT2 ; IF NOT, TEST FOR END OF LINE...
  310. FINDRGT1 LDA HINDEX ; IF YES, STORE VT BLOCK NUMBER IN HINDEXR.
  311.  STA HINDEXR
  312. FINDRGT2 JMP NXTBYTRT
  313. LINENDT LDA HINDEX ; CHECK TO SEE IF WE'RE AT END OF SCREEN ROW?
  314.  CMP #HNDXMAX ;  (40 BLOCKS ACROSS SCREEN)
  315.  BEQ PRTRCMDS ; IF YES, WE MUST TEST FURTHER...
  316.  JMP NXBYT3 ; NO, THEN CONTINUE SCANNING LINE
  317. PRTRCMDS BIT HINDEXL ; DID WE EVER FIND LEFT EDGE OF IMAGE?
  318.  BVS NXTBYT4 ; NO, JUST SEND CR/LF AND START NEXT LINE...
  319.  LDA HINDEXL
  320.  STA HINDEX
  321.  ASL
  322.  BCC PRTRCMD1
  323.  CLC
  324.  ADC #1
  325. PRTRCMD1 STA HINDEXL
  326.  JSR BKTODOTS ;  NUMBER OF DOTS TO TAB OVER...
  327.  LDY #4 ; NOW CONVERT HEX NUMBER OF DOTS IN THE
  328.  JSR HEXDEC ;  ASCII DECIMAL EQUIVALENT OF HEX NUMBERS...
  329.  LDA #ESC ; SEND PRINTER ESC F N3 N2 N1 N0
  330.  JSR OUTPUT ;  WHICH TELLS SCRIBE TO MOVE N3N2N1N0 DOTS
  331.  LDA #ASCIIF ;  OVER FROM LEFT MARGIN.
  332.  JSR OUTPUT
  333.  JSR OUTBUFF ; SEND N3 N2 N1 N0 TO PRINTER...
  334.  LDA HINDEXR ; NOW TELL SCRIBE HOW MANY COLUMNS TO PRINT.
  335.  ASL
  336.  BCC PRTRCMD2
  337.  CLC
  338.  ADC #1
  339. PRTRCMD2 SEC
  340.  SBC HINDEXL ; GET DIFFERENCE BETWEEN RIGHT AND LEFT SIDES.
  341.  CLC
  342.  ADC #1 ; ADD 1, SINCE WE SHOULD PRINT AT LEAST 1 BLK.
  343.  JSR BKTODOTS ; CONVERT TO NUMBER OF COLUMNS TO PRINT
  344.  LDY #4 ; NOW OBTAIN ASCII DECIMAL EQUIVALENT...
  345.  JSR HEXDEC
  346.  LDA #ESC ; SEND SCRIBE ESC C N3N2N1N0 FOR N3N2N1N0
  347.  JSR OUTPUT ;  COLUMNS OF HI-RES OUTPUT TO FOLLOW.
  348.  LDA #ASCIIG
  349.  JSR OUTPUT
  350.  JSR OUTBUFF ; SEND N3N2N1N0
  351.  LDA #$FF ; NOW SET PRFLG SO WE'LL ACTUALLY PRINT
  352.  STA PRFLG ;  ON OUR NEXT SCAN THROUGH LINE
  353.  JMP NEWVTBLK ; AND BEGIN PRINT SCAN...
  354. ;
  355. BKTODOTS EQU * ; CONVERTS VT BLK NO. TO NUMBER OF DOTS
  356. ;  VT BLK NO. IS PASSED IN ACCUMULATOR.
  357. ; RETURNS X=HIGH, A=LOW OF NUMBER OF DOTS.
  358.  STA MYBUF+1 ; STORE NUMBER OF VT. BLK.
  359.  LDX #0
  360.  STX MYBUF ; CLEAR HI-ORDER BYTE OF RESULT
  361.  ASL  ; WE MULTIPLE BLK. NUMBER BY 7 (7 PIXELS
  362.  ASL ;  ACROSS FOR EACH BLOCK) BY MULTIPLYING
  363.  ROL MYBUF ;
  364.  ASL  ;  BY 8 AND SUBTRACTING ONCE.
  365.  ROL MYBUF ;  MULTIPLYING HI BYTE TOO...
  366.  SEC
  367.  SBC MYBUF+1 ; SUBTRACT VT BLK NO. ONCE (8*A-A=7A)
  368.  BCS BKTODOT1 ; IF NO UNDERFLOW, DON'T WORRY ABOUT HI BYTE
  369.  DEC MYBUF ; UNDERFLOW - SO BORROW ONE FROM HI BYTE
  370. BKTODOT1 LDX MYBUF ; RETURN HI BYTE IN X REGISTER
  371.  RTS
  372. ;
  373. OUTBUFF EQU * ; SENDS 4 ASCII CHARS TO PRINTER STORED IN MYBUF
  374.  LDA #0
  375.  STA CNTR
  376. OUTBUF1 LDX CNTR
  377.  CPX #4
  378.  BEQ OUTBUF2
  379.  LDA MYBUF,X
  380.  JSR OUTPUT
  381.  INC CNTR
  382.  JMP OUTBUF1
  383. OUTBUF2 RTS
  384. HEXDEC EQU * ; CONVERTS 16-BIT HEX NUMBER TO ASCII CODES
  385. ;  FOR DECIMAL EQUIVALENT.  A=LOW BYTE,
  386. ;  X=HI BYTE OF NUMBER TO CONVERT, AND
  387. ;  Y=NUMBER OF CHARS TO MAKE (WE WANT 4).
  388. ; OUTPUT IS STORED IN MYBUF, LAST CHAR FIRST.
  389.  STA BINL
  390.  STX BINH
  391. HDLOOP LDX #16+1 ; 16 BITS FIRST TIME DO NOTHING
  392.  LDA #0
  393.  CLC  ; C=0 SO FIRST ROL LEAVES A=0
  394. DV10LOOP ROL
  395.  CMP #10
  396.  BCC DV10LT ; BRANCH IF <
  397.  SBC #10 ; C=1 FROM CMP AND LEFT SET
  398. DV10LT ROL BINL
  399.  ROL BINH
  400.  DEX
  401.  BNE DV10LOOP
  402.  ORA #'0' ;MAKE ASCII
  403.  STA MYBUF-1,Y
  404.  DEY
  405.  BNE HDLOOP
  406.  RTS
  407. CHAROUT BIT PG2STAT
  408.  BPL CHROUT1
  409.  STX PAGE2N
  410.  JSR OUTPUT
  411.  STA PAGE2Y
  412.  RTS
  413. CHROUT1 JSR OUTPUT
  414.  RTS
  415. ;
  416. ;
  417. ; SCREEN DUMP COMPLETED -
  418. FINI STA XFRFLGS ;RESTORE USER XFR OPTION
  419.  LDA #ESC
  420.  JSR OUTPUT
  421.  LDA #ASCIIA
  422.  JSR OUTPUT
  423.  LDA #CR
  424.  JSR OUTPUT
  425.  LDA #LF
  426.  JSR OUTPUT
  427.  LDA #ESC
  428.  JSR OUTPUT
  429.  LDA #ASCIID
  430.  JSR OUTPUT
  431.  LDA #NUL
  432.  JSR OUTPUT
  433.  LDA #$20
  434.  JSR OUTPUT
  435.  LDA OFFSET
  436.  LSR
  437.  LSR
  438.  LSR
  439.  LSR
  440.  TAY
  441.  LDA $7F8,Y ;THIS TURNS AUTO LINE FEEDS
  442.  AND #$EF ;BACK ON THE SUPER SERIAL CARD
  443.  ORA #$01
  444.  STA $7F8,Y
  445.  JSR DOSCONN
  446.  RTS
  447. *
  448. OUTPUT EQU * ;THIS HANDLES OUTPUT FOR SELECTED CARD
  449.  LDY OFFSET ;THIS IS FOR PASCAL 1 PROTOCOL
  450.  LDX SIGBYTES+1 ;SAME HERE....
  451.  JMP (OUTL) ;BRIDGE FOR JSR OUTPUT
  452. *
  453. PPOUT EQU * ;MARK THE SPOT HERE
  454.  STA PPDATA,Y ;STORE IT IN THE DATA PORT
  455. NOTRDY LDA PPSTAT,Y ;GET THE PARALLEL STATUS REGISTER
  456.  AND #$80 ;CHECK TO SEE IF IT'S BUSY
  457.  BEQ NOTRDY ;WAIT HERE IF IT IS
  458.  RTS  ;AND RETURN
  459. *
  460. FINDTYPE EQU * ;SUBROUTINE TO FIND INTERFACE
  461.  TYA  ;GET THE SLOT NUMBER FROM Y REGISTER
  462.  STA SLOT ;STORE IT FOR A MOMENT
  463.  ASL  ;SHIFT IT 4 TIMES
  464.  ASL
  465.  ASL
  466.  ASL  ;
  467.  STA OFFSET ;STORE IT FOR LATER USE
  468.  STX XFRFLGS ;STORE THE PRINT OPTION IN X REGISTER
  469.  LDA #$00 ;
  470.  STA SIGBYTES ;SET UP ZERO PAGE FOR CALCULATION
  471.  LDA SLOT ;GET THE SLOT AGAIN
  472.  AND #$07 ;ONLY NEED THE LAST THREE BITS
  473.  ORA #$C0 ;MAKE THE HIGH BYTE OF CN00
  474.  STA SIGBYTES+1 ;STORE IT THE HIGH BYTE OF CN00
  475.  LDY #5 ;LOOKING FOR PASCAL 1 PROTOCOL
  476.  LDA (SIGBYTES),Y ;CHECK BYTE CN05 FOR PASCAL 1
  477.  CMP #$38 ;CHECK #1
  478.  BNE PARAPNT
  479.  LDY #7 ;CHECK BYTE CN07 FOR PASCAL 1
  480.  LDA (SIGBYTES),Y ;
  481.  CMP #$18 ;CHECK #2
  482.  BNE PARAPNT
  483.  LDY #$B ;CHECK THE GENERIC SIGBYTE
  484.  LDA (SIGBYTES),Y ;DOING IT
  485.  CMP #$01 ;CHECK #3
  486.  BEQ PASCAL1 ;LOOKS LIKE PASCAL 1 TO ME....
  487.  BNE PARAPNT
  488. PASCAL1 EQU *
  489.  LDY #$0D ;GET THE INITILIZATION OFFSET
  490.  LDA (SIGBYTES),Y ;DOING THE TASK....
  491.  STA OUTL ;PUT IT IN THE LOWER HOOK BYTE..
  492.  LDA SIGBYTES+1 ;GET THE HIGH BYTE OF CN00
  493.  STA OUTH ;PUT IT IN THE HIGH HOOK BYTE..
  494.  JSR OUTPUT ;TURN THE CARD ON...
  495.  LDY #$F ;GET THE WRITE OFFSET BYTE..
  496.  LDA (SIGBYTES),Y ;WORKING AGAIN....
  497.  STA OUTL ;PUT IT AT THE LOWER HOOK BYTE
  498.  LDY #$0C ;CHECK THE DEVICE SIGBYTE
  499.  LDA (SIGBYTES),Y ;HO HUM
  500.  CMP #$31 ;IS IT A SSC CARD?
  501.  BNE RETURN ;NO START THE PROGRAM
  502.  LDA #$9 ;TURN OFF THE COMMAND BYTE
  503.  JSR OUTPUT ;HERE WE GO....
  504.  LDA #'Z' ;ZAP THE MUTHA..
  505.  JSR OUTPUT ;SEND IT TO THE CARD...
  506.  LDA #CR ;DONT FORGET THIS, MANY HEADACHES!!
  507.  JSR OUTPUT ;OUTPUT IT
  508. RETURN RTS  ;RETURN TO CALLER
  509. *
  510. PARAPNT EQU *
  511.  LDY #$A ;THIS IS AS GOOD A PLACE AS ANY TO
  512.  LDA (SIGBYTES),Y ;IDENTIFY THE APPLE PARALLEL INTERFACE
  513.  CMP #$20 ;
  514.  BNE APPLE3 ;
  515.  INY  ;
  516.  LDA (SIGBYTES),Y ;BYTES ARE: CN0A $20, CN0B $58 CN0B $FF
  517.  CMP #$58
  518.  BNE APPLE3
  519.  INY
  520.  LDA (SIGBYTES),Y
  521.  CMP #$FF
  522.  BNE APPLE3
  523.  LDA #>PPOUT ;LOCATION OF THE PARALLEL INTERFACE OUTPUTT
  524.  STA OUTL ;ROUTINE LOCATED SOMEWHERE IN THE PROGRAM
  525.  LDA #<PPOUT ;
  526.  STA OUTH ;
  527.  RTS
  528.  EOR #$10
  529.  AND #$70
  530.  BNE LOOP2
  531.  PLA
  532.  STA $C0F0
  533.  RTS
  534. *
  535. APPLE3 EQU *
  536.  LDA APP3ID
  537.  CMP #$C0
  538.  BNE TROUBLE
  539.  LDY #$B
  540.  LDA (SIGBYTES),Y
  541.  CMP #$08
  542.  BNE TROUBLE
  543.  INY
  544.  LDA (SIGBYTES),Y
  545.  CMP #$48
  546.  BNE TROUBLE
  547.  LDA #7
  548.  JSR OUTPRT
  549.  LDA #0
  550.  JSR COUT
  551.  JSR SETVID
  552.  LDA #THREEOUT
  553.  STA OUTL
  554.  LDA #<THREEOUT
  555.  STA OUTH
  556.  RTS
  557. *
  558. THREEOUT EQU *
  559.  PHA
  560. LOOP2 LDA $C0F1
  561.  EOR #$10
  562.  AND #$70
  563.  BNE LOOP2
  564.  PLA
  565.  STA $C0F0
  566.  RTS
  567. *
  568. TROUBLE EQU *
  569.  LDA #$FF
  570.  STA OFFSET
  571.  PLA
  572.  PLA
  573.  RTS
  574. *
  575. GrafBas EQU *
  576.  JSR COMBYTE ;USE APPLESOFT TXTPTR TO GET SLOT NUMBER
  577.  TXA ;RETURNED IN X REGISTER, MOVE TO ACCUMULATOR
  578.  PHA  ;PUSH ON THE STACK FOR A MOMENT
  579.  JSR COMBYTE ;GET THE PRINT OPTION
  580. ;ALREADY IN THE X REGISTER
  581.  PLA ;RESTORE THE SLOT NUMBER
  582.  TAY  ;PUT IT IN THE Y REGISTER
  583.  JMP GrafML ;ALREADY FOR MACHINE LANGUAGE INTERFACE
  584. DOSCONN LDA WARMSTART
  585.  CMP #$4C
  586.  BNE DOSHOOK
  587.  LDA WARMSTART+1
  588.  BNE DOSHOOK
  589.  LDA WARMSTART+2
  590.  CMP #$BE
  591.  BNE DOSHOOK
  592. PRODOSIO LDY #$03
  593. L016 LDA VDOSIO,Y
  594.  STA CSWL,Y
  595.  DEY
  596.  BPL L016
  597.  RTS
  598. DOSHOOK JSR DOSIO
  599.  RTS
  600. TABLE DW $2000,$2080 ;THESE ARE HIRES BASE ADDRESSES
  601.  DW $2100,$2180 ;FOR EACH SET OF EIGHT HIRES ROWS
  602.  DW $2200,$2280
  603.  DW $2300,$2380
  604.  DW $2028,$20A8
  605.  DW $2128,$21A8
  606.  DW $2228,$22A8
  607.  DW $2328,$23A8
  608.  DW $2050,$20D0
  609.  DW $2150,$21D0
  610.  DW $2250,$22D0
  611.  DW $2350,$23D0
  612.